#ifndef __MOTOR_H
#define __MOTOR_H

#include "main.h"
#include "stdbool.h"

// 电机控制模式
typedef enum
{
  MOTOR_CTRL_OPEN_LOOP = 0,    // 开环控制
  MOTOR_CTRL_CLOSED_LOOP,      // 闭环控制
} motor_ctrl_mode_t;

// 电机工作模式
typedef enum
{
  MOTOR_MODE_STOP = 0,         // 停止
  MOTOR_MODE_INIT,
  MOTOR_MODE_POSITION,         // 位置控制
  MOTOR_MODE_TORQUE,           // 力矩控制
  MOTOR_MODE_VELOCITY,         // 速度控制
} motor_mode_t;

// 电机状态结构体
typedef struct
{
  float position;              // 位置
  float speed;                 // 速度
  float current_q;             // q轴电流
  float current_d;             // d轴电流
  float voltage_q;             // q轴电压
  float voltage_d;             // d轴电压
  float temperature;           // 温度
  bool is_fault;               // 故障标志
} motor_state_t;

// 电机控制目标结构体
typedef struct
{
  motor_ctrl_mode_t ctrl_mode; // 控制模式
  motor_mode_t work_mode;      // 工作模式
  // 用户设置的目标
  struct
  {
    float position;         // 位置
    float speed;            // 速度
    float voltage_d;        // d轴电压
    float current_q;        // q轴电流
  } user_target;

  // 各环路输出
  struct
  {
    float speed;            // 位置环输出的速度
    float torque;           // 速度环输出的力矩
    float voltage_d;        // 电流环输出的d轴电压
  } loop_output;

  struct motor
  {
    float speed_max;         // 最大速度
    float voltage_max;       // 最大电压
    float current_max;       // 最大电流
  } limit;
  
  float voltage_d;           // 最终的输出给FOC的d轴电压
} motor_target_t;

// 电机配置结构体
typedef struct
{
  float voltage_power_supply;         // 母线电压
  float voltage_limit;                // 电压限制
  float current_limit;                // 电流限制
  float temperature_limit;            // 温度限制
  float pole_pairs;                   // 极对数
  float gear_ratio;                   // 减速比
  uint8_t abz_encode_lines;           // abz编码器线数
  float hall_zero_electric_Angle;     // 霍尔传感器零点电角度
  float abz_zero_electric_Angle;      // abz编码器零点电角度

  float cf_kp;                        // 力矩模式电流环PID
  float cf_ki;
  float cf_kd;
  float cf_maxIntergral;              // 力矩模式电流环积分限幅
  float cf_maxOutput;                 // 力矩模式电流环输出限幅

  float c_kp;                         // 其它模式电流环PID
  float c_ki;
  float c_kd;
  float c_maxIntergral;              // 其它模式电流环积分限幅
  float c_maxOutput;                 // 其它模式电流环输出限幅

  float s_kp;                        // 速度环PID
  float s_ki;
  float s_kd;
  float s_maxIntergral;              // 速度环积分限幅
  float s_maxOutput;                 // 速度环输出限幅

  float p_kp;                        // 位置环PID
  float p_ki;
  float p_kd;
  float p_maxIntergral;              // 位置环积分限幅
  float p_maxOutput;                 // 位置环输出限幅
} motor_config_t;

extern motor_state_t motor_state;
extern motor_target_t motor_target;
extern motor_config_t motor_config;

void Set_Final_Vd(void);

#endif

